שאלה על עיצוב מסד
מצב ראשון:
שתי טבלאות, אחת movies עם קצת שדות (בערך 20) ואחת movies_metadata
(שתחיל 4 שדות: ID, Movie_ID, key, value),
**במקום שבטבלה movies יהיה שדה title יהיה את ה key "title" והvalue שלו.. (מערך)
מצב שני:
טבלה אחת שתכיל את כל הערכים שיכולים להיות בסרט (בערך 200) ולרוב 50% היו ריקים (לא לכל סרט יש סרט המשך\פייסבוק פייג'\ערוץ ביוטיוב וכו').
עכשו יש כמה Views לסרט; תמונות מהסרט שבו אני שולף בערך 20 שדות (במצב הראשון זה 20 שאילתות "קלות", במצב השני זאת שאילתא אחת "כבדה").
בView של הכותר אני שולף בערך 140 שדות (מצב ראשון: זה 140 שאילתות "קלות", במצב שני שאילתא אחת "כבדה")
מבחינת סידור למערכת - אני מעדיף ת'מצב הראשון, ככה אין יותר מדי שדות ואני יכול להוסיף מפתחות בלי להוסיף שדה לטבלה.
אבל מבחינת מהירות?
מבחינת ביצועים?
מה עדיף? תודה מראש
5 תשובות
במקרה של שני טבלאות זה סה"כ שני שאילתות מאוד מהירות:
אחת לשלוף את המידע על הסרט ואחת לשלוף את כל השורות שקיימות ב metadata
זה יהיה טיפה יותר איטי מלשלוף שורה אחת עם המון שדות ריקים אבל לא בהרבה.
קח בחשבון שברגע שאתה תתחיל להרגיש עומס על השרת שלך, אתה תכניס כמות גדולה של לשיפות לקאש
והשאלה הזו יחסית תרד מהפרק, לכן אני הייתי הולך על האופציה הראשונה, שתמשור את הטבלאות יותר נקיות וקטנות.
אגב, השאלה שלך היא usecase קלאסי למסד נתונים כמו MongoDb או CoucheDb שמאפשר לשמור רשומות עם כמות שדות שונה ומשונה. אם אתה הולך להפעיל את האתר על שרת משלך - זה אחלה הזדמנות להכיר ולהתנסות עם מסד נתונים חדש.
במקרה הראשון אלו לא היו 2 שאילתות (או שכן?), כי אני לא רוצה לטעון את כל הmetadata של הסרט לזיכרון אז אני שולף רק את הדרושים..
במקרה שאני צריך את השם של הסרט (title) השאילתא תיהיה כזאת:
ולא שאילתא אחת כזאת:
או שעדיף לשלוף את כל המפתחות בשאילתא אחת (ובמקרה של עדכון, עדיף לעדכן כל מפתח בנפרד או את כולן [רק אלו שהשתנו] באותה השאילתא..) ?
אופציה א. לעשות 20 שליפות רק למטה דטה שאתה צריך
אופציה ב. לעשות שליפה אחת של 50 שורות ולהתעלם ממה שאתה לא צריך בצד של הסקריפט.
אופציה א. יותר איטית בגלל שיש הרבה פניות למסד, הרבה קריאות נפרדות מדיסק בצד של המסד והרבה תעבורה בין PHP למסד
אופציה ב. אוכלת יותר זכרון. אם תחשב פי כמה יותר זיכרון, תגלה שזה מספר יחסית נמוך שבהחלט שווה את זה.
למה 20 שליפות?
FROM `metaData`
WHERE `key` IN('title','facebook','twitter','googleplus')